ZeroMQ একটি উচ্চ-পারফরম্যান্স মেসেজিং লাইব্রেরি, যা বিভিন্ন মেসেজিং প্যাটার্নের মাধ্যমে প্রক্রিয়া এবং সিস্টেমের মধ্যে দ্রুত ডেটা আদান-প্রদান করতে সক্ষম। এর কাজের ধরণগুলো বিভিন্ন ক্ষেত্রে ব্যবহৃত হয়, যেমন ডিস্ট্রিবিউটেড সিস্টেম, রিয়েল-টাইম ডেটা ট্রান্সমিশন, এবং ক্লায়েন্ট-সার্ভার আর্কিটেকচার। ZeroMQ-এর কয়েকটি সাধারণ কাজের ধরণ হলো Push/Pull, Pub/Sub, এবং Request/Reply। নিচে প্রতিটি প্যাটার্নের বিস্তারিত বর্ণনা দেওয়া হলো:
১. Push/Pull মেসেজিং প্যাটার্ন
Push/Pull হলো এমন একটি মেসেজিং প্যাটার্ন, যেখানে Producer (Push) প্রক্রিয়াগুলি Worker (Pull) প্রক্রিয়াগুলোর মধ্যে মেসেজ পাঠায় এবং এই মেসেজগুলি বিভিন্ন প্রক্রিয়া বা সিস্টেমের মধ্যে বিতরণ করে। এটি সাধারণত task distribution বা workload balancing এর ক্ষেত্রে ব্যবহৃত হয়।
কাজের ধরণ:
- Push Socket: Push সকার একটি মেসেজ পাঠায় এবং এক বা একাধিক Worker (Pull) প্রক্রিয়ার মধ্যে মেসেজ বিতরণ করে।
- Pull Socket: Pull সকার মেসেজ গ্রহণ করে এবং মেসেজ প্রক্রিয়া করে।
- Round-Robin Distribution: Push/Pull প্যাটার্নে মেসেজগুলো Round-Robin পদ্ধতিতে Worker প্রক্রিয়াগুলোর মধ্যে বিতরণ করা হয়, যা লোড ব্যালেন্সিং নিশ্চিত করে।
উদাহরণ:
ধরা যাক, একটি টাস্ক ম্যানেজমেন্ট সিস্টেম আছে যেখানে Push সকার বিভিন্ন টাস্ক তৈরি করে এবং Pull সকার টাস্কগুলো প্রক্রিয়া করে। Push সকার টাস্কগুলো Worker প্রক্রিয়াগুলোর মধ্যে সমানভাবে বিতরণ করে।
# Producer (Push)
import zmq
context = zmq.Context()
socket = context.socket(zmq.PUSH)
socket.bind("tcp://*:5555")
for i in range(10):
socket.send_string(f"Task {i}")
# Worker (Pull)
import zmq
context = zmq.Context()
socket = context.socket(zmq.PULL)
socket.connect("tcp://localhost:5555")
while True:
message = socket.recv_string()
print(f"Received: {message}")
২. Pub/Sub মেসেজিং প্যাটার্ন
Pub/Sub (Publish/Subscribe) হলো একটি মেসেজিং প্যাটার্ন, যা এক বা একাধিক Publisher প্রক্রিয়া মেসেজ প্রকাশ করে এবং এক বা একাধিক Subscriber প্রক্রিয়া সেই মেসেজ সাবস্ক্রাইব করে। এই প্যাটার্নটি সাধারণত real-time data broadcasting এর ক্ষেত্রে ব্যবহৃত হয়, যেমন স্টক মার্কেট আপডেট বা লাইভ ইভেন্ট স্ট্রিমিং।
কাজের ধরণ:
- Publisher Socket: Publisher সকার একটি নির্দিষ্ট বিষয়ে (topic) মেসেজ প্রকাশ করে।
- Subscriber Socket: Subscriber সকার নির্দিষ্ট বিষয়ে সাবস্ক্রাইব করে এবং সেই বিষয়ে প্রকাশিত মেসেজ গ্রহণ করে।
- Filter by Topic: Subscriber সকার নির্দিষ্ট বিষয়ের মেসেজ ফিল্টার করতে পারে। এতে Subscriber সকার শুধু সেই মেসেজগুলো গ্রহণ করে যা তাদের আগ্রহের বিষয়ে প্রাসঙ্গিক।
উদাহরণ:
একটি সিস্টেম যেখানে Publisher সকার আবহাওয়ার আপডেট প্রদান করে এবং Subscriber সকার নির্দিষ্ট শহরের আবহাওয়ার তথ্য গ্রহণ করে।
# Publisher
import zmq
import time
context = zmq.Context()
socket = context.socket(zmq.PUB)
socket.bind("tcp://*:5556")
while True:
topic = "weather"
message = f"{topic} - Temperature: 30°C"
socket.send_string(message)
time.sleep(1)
# Subscriber
import zmq
context = zmq.Context()
socket = context.socket(zmq.SUB)
socket.connect("tcp://localhost:5556")
socket.setsockopt_string(zmq.SUBSCRIBE, "weather")
while True:
message = socket.recv_string()
print(f"Received: {message}")
৩. Request/Reply মেসেজিং প্যাটার্ন
Request/Reply (REQ/REP) হলো এমন একটি মেসেজিং প্যাটার্ন, যা Client-Server আর্কিটেকচারের মতো কাজ করে। Client (Request) প্রক্রিয়া একটি অনুরোধ (request) পাঠায় এবং Server (Reply) প্রক্রিয়া সেই অনুরোধের ভিত্তিতে একটি প্রতিক্রিয়া (reply) প্রদান করে। এই প্যাটার্নটি সাধারণত synchronous communication এবং RPC (Remote Procedure Call) এর ক্ষেত্রে ব্যবহৃত হয়।
কাজের ধরণ:
- Request (REQ) Socket: REQ সকার একটি অনুরোধ পাঠায় এবং তার প্রতিক্রিয়া পেতে অপেক্ষা করে।
- Reply (REP) Socket: REP সকার অনুরোধ গ্রহণ করে এবং সেই অনুরোধের ভিত্তিতে একটি প্রতিক্রিয়া পাঠায়।
- Synchronous Communication: REQ এবং REP সকার একটি সংযোগে একটি অনুরোধ-প্রতিক্রিয়া আদান-প্রদান সম্পন্ন করে।
উদাহরণ:
ধরা যাক, একটি ক্লায়েন্ট সার্ভার সিস্টেম আছে, যেখানে ক্লায়েন্ট (REQ) সার্ভারকে একটি অনুরোধ পাঠায় এবং সার্ভার (REP) সেই অনুরোধের ভিত্তিতে একটি উত্তর প্রদান করে।
# Client (REQ)
import zmq
context = zmq.Context()
socket = context.socket(zmq.REQ)
socket.connect("tcp://localhost:5557")
for i in range(5):
socket.send_string(f"Hello {i}")
message = socket.recv_string()
print(f"Received reply: {message}")
# Server (REP)
import zmq
context = zmq.Context()
socket = context.socket(zmq.REP)
socket.bind("tcp://*:5557")
while True:
message = socket.recv_string()
print(f"Received request: {message}")
socket.send_string("World")
সংক্ষেপে:
ZeroMQ-র Push/Pull, Pub/Sub, এবং Request/Reply মেসেজিং প্যাটার্নগুলো বিভিন্ন ধরণের অ্যাপ্লিকেশনের জন্য অত্যন্ত কার্যকরী।
- Push/Pull প্যাটার্ন সাধারণত লোড ব্যালেন্সিং এবং টাস্ক ডিস্ট্রিবিউশনের জন্য ব্যবহৃত হয়।
- Pub/Sub প্যাটার্ন রিয়েল-টাইম ব্রডকাস্টিং এবং ডেটা স্ট্রিমিংয়ের জন্য উপযুক্ত।
- Request/Reply প্যাটার্ন ক্লায়েন্ট-সার্ভার মডেলের জন্য কার্যকরী, যেখানে এক প্রক্রিয়া অনুরোধ পাঠায় এবং অন্যটি সেই অনুরোধের উত্তর প্রদান করে।
ZeroMQ-র প্যাটার্নগুলো ব্যবহার করে ডিস্ট্রিবিউটেড সিস্টেম এবং বিভিন্ন অ্যাপ্লিকেশনে দ্রুত এবং কার্যকরী মেসেজিং ব্যবস্থা তৈরি করা সম্ভব।